package com.redis.contrller;

import com.github.binarywang.wxpay.bean.WxPayApiData;
import com.github.binarywang.wxpay.bean.coupon.*;
import com.github.binarywang.wxpay.bean.notify.*;
import com.github.binarywang.wxpay.bean.request.*;
import com.github.binarywang.wxpay.bean.result.*;
import com.github.binarywang.wxpay.bean.result.enums.TradeTypeEnum;
import com.github.binarywang.wxpay.bean.transfer.TransferBatchesRequest;
import com.github.binarywang.wxpay.bean.transfer.TransferBatchesResult;
import com.github.binarywang.wxpay.config.WxPayConfig;
import com.github.binarywang.wxpay.constant.WxPayConstants;
import com.github.binarywang.wxpay.exception.WxPayException;
import com.github.binarywang.wxpay.service.*;
import com.github.binarywang.wxpay.service.impl.WxPayServiceImpl;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.client.methods.HttpRequestBase;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.data.redis.core.ZSetOperations;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.annotation.Resource;
import java.io.File;
import java.io.InputStream;
import java.util.*;
import java.util.concurrent.TimeUnit;


@RestController
public class RedisContrller {
    @Autowired
    StringRedisTemplate stringRedisTemplate;


    /**
     * 增加数值 增加计数器的值
     *
     * @return
     */
    @GetMapping("add/increment")
    private Long setIncrement() {
        return stringRedisTemplate.opsForValue().increment("counter");
    }

    /**
     * 获取当前计数器的值，如果计数器不存在，则返回null。
     *
     * @return
     */
    @GetMapping("get/increment")
    private String getIncrement() {
        return stringRedisTemplate.opsForValue().get("counter");
    }

    /**
     * token的存储
     *
     * @param username
     * @param password
     * @return
     */
    @GetMapping("get/token")
    public String storeUserAndGenerateToken(String username, String password) {
        long EXPIRATION_TIME = 30 * 60;
        // 在这里进行用户名和密码的验证，验证通过后存储用户信息到Redis中。
        // 这里假设验证通过，存储用户信息到Redis中。你可以根据实际情况进行修改。
        stringRedisTemplate.opsForValue().set("user:" + username, password, EXPIRATION_TIME, TimeUnit.SECONDS); // 设置用户密码的过期时间，这里与登录令牌的过期时间相同。
        stringRedisTemplate.opsForValue().set("login:" + username, "qw34dfg45", EXPIRATION_TIME, TimeUnit.SECONDS); // 生成并存储登录令牌。这里使用简单的随机字符串作为令牌，你可以根据需要进行修改。
        return "qw34dfg45"; // 返回生成的令牌字符串。
    }

    /**
     * 验证码
     *
     * @param phone
     * @return
     */
    @GetMapping("get/captcha")
    public String generateCaptcha(String phone) {
        String CAPTCHA_KEY_PREFIX = "captcha:";
        int CAPTCHA_LENGTH = 6;
        Random RANDOM = new Random();
        StringBuilder captcha = new StringBuilder(CAPTCHA_LENGTH); // 用于存储生成的验证码。
        for (int i = 0; i < CAPTCHA_LENGTH; i++) { // 循环生成验证码的每一位。
            captcha.append(RANDOM.nextInt(10)); // 生成0-9之间的随机数，并将其追加到验证码中。
        }
        String key = CAPTCHA_KEY_PREFIX + phone; // 生成唯一的key，用于存储验证码。
        stringRedisTemplate.opsForValue().set(key, captcha.toString()); // 将验证码存储到Redis中，使用key作为存储的标识。
        return key; // 返回生成的验证码的key。用户可以将其显示在前端页面上，以便用户输入验证。
    }

    private final String LEADERBOARD_KEY = "leaderboard";

    /**
     * 初始化
     *
     * @param user
     * @param score
     */
    @GetMapping("add/UserScore")
    public void addUserScore(String user, double score) {
        ZSetOperations<String, String> operations = stringRedisTemplate.opsForZSet();
        operations.add(LEADERBOARD_KEY, user, score);
    }

    /**
     * 但积分增加的时候兑积分的增加
     *
     * @param user
     * @param score
     */
    @GetMapping("increment/UserScore")
    public void incrementUserScore(String user, double score) {
        ZSetOperations<String, String> operations = stringRedisTemplate.opsForZSet();
        operations.incrementScore(LEADERBOARD_KEY, user, score);
    }

    /**
     * 获取列表
     *
     * @return
     */
    @GetMapping("getLeaderboard")
    public List<Map<String, Object>> getLeaderboard() {
        ZSetOperations<String, String> operations = stringRedisTemplate.opsForZSet();
        Set<ZSetOperations.TypedTuple<String>> entries = operations.reverseRangeWithScores(LEADERBOARD_KEY, 0, 6);
        List<Map<String, Object>> leaderboard = new ArrayList<>();
        for (ZSetOperations.TypedTuple<String> entry : entries) {
            Map<String, Object> leader = new HashMap<>();
            leader.put("user", entry.getValue());
            leader.put("score", entry.getScore());
            leaderboard.add(leader);
        }
        return leaderboard;
    }

    private final String LIST_KEY_PREFIX = "list:"; // 用于存储List数据的key前缀。可以根据需要进行调整。

    // 向Redis List中添加元素

    /**
     * 向list添加元素
     *
     * @param listKey
     * @param element
     */
    @GetMapping("add/list")
    public void addToList(String listKey, String element) {
        stringRedisTemplate.opsForList().leftPush(listKey, element);
    }

    /**
     * 获取list的数据
     *
     * @param listKey
     * @return
     */
    @GetMapping("get/list")
    public List<String> getList(String listKey) {
        return stringRedisTemplate.opsForList().range(listKey, 0, -1);
    }

    private final String HASH_KEY_PREFIX = "hash:"; // 用于存储Hash数据的key前缀。可以根据需要进行调整。

    /**
     * 向Redis Hash中添加元素
     *
     * @param hashKey
     * @param field
     * @param value
     */
    @GetMapping("add/hash")
    public void addToHash(String hashKey, String field, String value) {
        stringRedisTemplate.opsForHash().put(HASH_KEY_PREFIX + hashKey, field, value);
    }

    /**
     * 从Redis Hash中获取指定字段的值
     *
     * @param hashKey
     * @param field
     * @return
     */
    @GetMapping("get/hash")
    public String getFieldValue(String hashKey, String field) {
        return stringRedisTemplate.opsForHash().get(HASH_KEY_PREFIX + hashKey, field).toString();
    }

    @GetMapping("appID")
    public String getHASH_KEY_PREFIX() throws WxPayException {
        WxPayService payService = new WxPayServiceImpl();
        WxPayConfig wxPayConfig = new WxPayConfig();
        wxPayConfig.setApiV3Key("sanliaojiankangkanglaikangkeji16");
        wxPayConfig.setCertSerialNo("138D8A38ED4BB71BFA32EDC3A0BD624803740E10");
        wxPayConfig.setAppId("wx93a1256052cdd362");
        wxPayConfig.setMchId("1615465252");
        wxPayConfig.setMchKey("sanliaojiankangkanglaikangkeji15");
        wxPayConfig.setPrivateKeyPath("https://lk-joolun-dev.oss-cn-beijing.aliyuncs.com/-1/editor/6346aad1-e82e-47bc-8765-2fdccfc6993f.pem");
        wxPayConfig.setPrivateCertPath("https://lk-joolun-dev.oss-cn-beijing.aliyuncs.com/-1/editor/04fdd456-519e-4da2-b2aa-e17f41f04213.pem");
        wxPayConfig.setKeyPath("https://lk-joolun-dev.oss-cn-beijing.aliyuncs.com/-1/editor/36db3f03-16be-498e-949f-4788b5967fbe.p12");
        payService.setConfig(wxPayConfig);
        TransferBatchesRequest transferBatchesRequest = new TransferBatchesRequest();
        transferBatchesRequest.setAppid("wx93a1256052cdd362");
        transferBatchesRequest.setBatchName("测试");
        transferBatchesRequest.setOutBatchNo("12132132434242");
        transferBatchesRequest.setBatchRemark("234234");
        transferBatchesRequest.setTotalAmount(3);
        transferBatchesRequest.setTotalNum(1);
        List<TransferBatchesRequest.TransferDetail> transferDetailList = new ArrayList<>();
        TransferBatchesRequest.TransferDetail transferDetail = new TransferBatchesRequest.TransferDetail();
        transferDetail.setOpenid("oOE_54tI-Ex6LfNp_bVo4AmdEF_g");
        transferDetail.setOutDetailNo("1232432423432423234");
        transferDetail.setTransferAmount(3);
        transferDetail.setTransferRemark("测试");
//        transferDetail.setUserName("测试");
        transferDetailList.add(transferDetail);
        transferBatchesRequest.setTransferDetailList(transferDetailList);
        transferBatchesRequest.setTransferSceneId("111111111");

        TransferBatchesResult transferBatchesResult = payService.getTransferService().transferBatches(transferBatchesRequest);
        System.out.println(transferBatchesResult.toString());
        return HASH_KEY_PREFIX;
    }
}


